package com.irisking.server.coder;

import com.irisking.server.entity.TransforData;
import com.irisking.server.utils.ConvertUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * 数据包解码器
 * <pre>
 * 数据包格式
 * +——----——+——-----——+——----——+——----——+——-----——+——-----——+
 * |  同步头	   |  模块号     |  命令号    |   长度    |   数据     |     校验    |
 * +——----——+——-----——+——----——+——----——+——-----——+——-----——+
 * </pre>
 * 同步头 2字节
 * 模块号 2字节
 * 命令号 2字节
 * 长度 4字节(数据部分占有字节数量)
 * 校验 2字节
 * @author -weiz-
 *
 */
public class ResponseEncoder extends MessageToByteEncoder<TransforData> {

	@Override
	protected void encode(ChannelHandlerContext ctx, TransforData respData, ByteBuf buffer) throws Exception {
		//System.out.println("返回请求:开始编码");
		//System.out.println("返回请求:" + "module:" + respData.getCommCode() + " cmd:" + respData.getCommSubCode() + " length:" + respData.getData().length);
		short checkCode = 0;
		//包头
		byte[] header = ConvertUtil.shortToByte(ConstantValue.HEADER_FLAG);
		buffer.writeBytes(header);
		checkCode += CalculateSum(header);
		//commCode和commSubCode
		byte[] commCode = ConvertUtil.shortToByte(respData.getCommCode());
		buffer.writeBytes(commCode);
		checkCode += CalculateSum(commCode);

		byte[] commSubCode = ConvertUtil.shortToByte(respData.getCommSubCode());
		buffer.writeBytes(commSubCode);
		checkCode += CalculateSum(commSubCode);

		//长度
		if (respData.getData() != null && respData.getData().length > 0) {
			byte[] length = ConvertUtil.intToByte(respData.getData().length);
			buffer.writeBytes(length);
			buffer.writeBytes(respData.getData());

			checkCode += CalculateSum(length);
			checkCode += CalculateSum(respData.getData());

		} else {
			byte[] length = ConvertUtil.intToByte(0);
			buffer.writeBytes(length);
			checkCode += CalculateSum(length);
		}

		byte[] check = ConvertUtil.shortToByte(checkCode);
		buffer.writeBytes(check);
	}

	/**
	 * 计算校验
	 * @param data
	 * @return
	 */
	private short CalculateSum(byte[] data){
		short ret = 0;
		for (byte b: data) {
			ret +=b;
		}
		return ret;
	}
}
